package me.zhengjie.modules.inspection.service.impl;

import me.zhengjie.modules.inspection.domain.InspectionTemplateItemRel;
import me.zhengjie.utils.ValidationUtil;
import me.zhengjie.modules.inspection.repository.InspectionTemplateItemRelRepository;
import me.zhengjie.modules.inspection.service.InspectionTemplateItemRelService;
import me.zhengjie.modules.inspection.service.dto.InspectionTemplateItemRelDTO;
import me.zhengjie.modules.inspection.service.dto.InspectionTemplateItemRelQueryCriteria;
import me.zhengjie.modules.inspection.service.mapper.InspectionTemplateItemRelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.QueryHelp;

/**
* @author xuyukun
* @date 2019-07-07
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class InspectionTemplateItemRelServiceImpl implements InspectionTemplateItemRelService {

    @Autowired
    private InspectionTemplateItemRelRepository inspectionTemplateItemRelRepository;

    @Autowired
    private InspectionTemplateItemRelMapper inspectionTemplateItemRelMapper;

    @Override
    public Object queryAll(InspectionTemplateItemRelQueryCriteria criteria, Pageable pageable){
        Page<InspectionTemplateItemRel> page = inspectionTemplateItemRelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
        return PageUtil.toPage(page.map(inspectionTemplateItemRelMapper::toDto));
    }

    @Override
    public Object queryAll(InspectionTemplateItemRelQueryCriteria criteria){
        return inspectionTemplateItemRelMapper.toDto(inspectionTemplateItemRelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
    }

    @Override
    public InspectionTemplateItemRelDTO findById(Long id) {
        Optional<InspectionTemplateItemRel> inspectionTemplateItemRel = inspectionTemplateItemRelRepository.findById(id);
        ValidationUtil.isNull(inspectionTemplateItemRel,"InspectionTemplateItemRel","id",id);
        return inspectionTemplateItemRelMapper.toDto(inspectionTemplateItemRel.get());
    }

    @Override
    public List<InspectionTemplateItemRel> findByTemplateId(Long id) {
        return inspectionTemplateItemRelRepository.findByTemplateId(id);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public InspectionTemplateItemRelDTO create(InspectionTemplateItemRel resources) {
        return inspectionTemplateItemRelMapper.toDto(inspectionTemplateItemRelRepository.save(resources));
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(InspectionTemplateItemRel resources) {
        Optional<InspectionTemplateItemRel> optionalInspectionTemplateItemRel = inspectionTemplateItemRelRepository.findById(resources.getId());
        ValidationUtil.isNull( optionalInspectionTemplateItemRel,"InspectionTemplateItemRel","id",resources.getId());

        InspectionTemplateItemRel inspectionTemplateItemRel = optionalInspectionTemplateItemRel.get();
        // 此处需自己修改
        resources.setId(inspectionTemplateItemRel.getId());
        inspectionTemplateItemRelRepository.save(resources);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        inspectionTemplateItemRelRepository.deleteById(id);
    }
}